Java集合:HashMap二次hash 您所在的位置:网站首页 java hashmap扩容机制 Java集合:HashMap二次hash

Java集合:HashMap二次hash

2023-12-21 09:38| 来源: 网络整理| 查看: 265

二次Hash

Java中的HashMap使用了二次hash来解决哈希冲突的问题。哈希冲突是指不同的键值对可能会被映射到同一个桶中,这会导致查找效率降低。

为了解决这个问题,HashMap使用了二次hash算法来重新计算哈希值,从而将键值对分散到不同的桶中。 具体来说,HashMap中每个桶都是一个链表,当发生哈希冲突时,新的键值对会被插入到链表的头部。当链表长度超过一定阈值时,链表会被转换为红黑树,以提高查找效率。

而二次hash算法则是在计算哈希值时,使用了两个不同的哈希函数,以增加哈希值的随机性,从而减少哈希冲突的概率。 因此,HashMap中的二次hash算法可以提高哈希表的性能和效率,使得查找、插入和删除操作更加快速和稳定。

扩容机制

HashMap的扩容机制是指当HashMap中的元素数量超过了负载因子(load factor)与容量(capacity)的乘积时,就会自动扩容,以保证HashMap的性能和效率,比如负载因子是0.7,容量是10,在元素数量达到8的时候就会触发扩容。

具体来说,当HashMap中的元素数量超过了负载因子与容量的乘积时,就会触发扩容操作。扩容操作会将HashMap的容量扩大一倍,并重新计算每个元素的哈希值和桶位置,然后将元素重新分配到新的桶中。

这个过程需要重新分配内存空间,并将原有的元素复制到新的内存空间中,因此会带来一定的性能开销。 在扩容过程中,HashMap会将原有的桶中的元素重新分配到新的桶中,这个过程可能会导致哈希冲突的发生。

为了解决这个问题,HashMap使用了二次hash算法来重新计算哈希值,从而将键值对分散到不同的桶中,以减少哈希冲突的概率。 总之,HashMap的扩容机制可以保证HashMap的性能和效率,并且通过二次hash算法来解决哈希冲突的问题。

并发死链

线程1刚刚记录完e=a,next=b,就发生了线程切换,换到了线程2执行

线程2完成了整套头插法扩容流程,此时线程1的扩容动作还没有执行,线程1需要继续刚才暂停的位置

线程1继续刚记录完的e=a,next=b,第一轮循环结束后e=b,此时线程2早已经把b的next值指向a,所以next值并没有指向null

第二轮循环结束,第三轮循环开始,此时线程1操作e拿到的next值是a,这就形成了b指向a,a指向b

虽然程序执行结束了,但在下一次查找这个链表a的时候,就会陷入死循环



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有